package com.atguigu.gmall.product;

import com.atguigu.gmall.common.constant.RedisConst;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableDiscoveryClient
// 根据定义的扫描路径,把符合扫描规则的类装配到 Spring 容器中,这里主要是为了扫描 common/service-util 模块中的内容,里面有一些相关配置需要扫描进来
@ComponentScan({"com.atguigu.gmall"})
// CommandLineRunner 接口会在 IOC 容器准备就绪后执行
public class ServiceProductApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProductApplication.class, args);
    }


    private RedissonClient redissonClient;

    @Autowired
    public ServiceProductApplication(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    /*
            该方法会在项目启动,IOC 容器准备就绪后执行,可以用于执行一些初始化操作

            初始化布隆过滤器
                关于当数据删除时布隆过滤器存储的对应标识是否同样需要删除: 不需要
                    原因
                         (1) 布隆过滤器中存储的只是数据的标识,占用空间非常小
                         (2) 如果删除了标识,则需要承受误差率,即同一个标识有可能对应多条数据,删除标识后,其他未删除的数据也查询不到了
                         (3) 布隆过滤器解决的是防止对方使用随机的 key 值访问项目,导致 redis 中存储了大量标识,删除数据对应的标识并不是随机的
                    解决方案
                        可以定期清空布隆过滤器中的数据,然后重新将数据库中的数据再添加一遍到布隆过滤器中(定时任务 + 访问量少的时候)
         */
    @Override
    public void run(String... args) throws Exception {
        // 获取布隆过滤器
        RBloomFilter<Object> bloomFilter = this.redissonClient.getBloomFilter(RedisConst.SKU_BLOOM_FILTER);
        // 初始化布隆过滤器,预计统计元素数量为 100000,期望误差率为 0.01
        bloomFilter.tryInit(100000, 0.01);
    }
}